package main.pmc;

import cn.hutool.core.io.FileUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import com.alibaba.fastjson.JSONArray;
import utils.SmallTool;
import utils.StringUtil;

import java.io.File;
import java.sql.SQLException;
import java.util.List;

import static main.pmc.DownPmcFile.getFileName;

/**
 * @Author: 葛成瑞
 * @Date: 2025/3/5 16:49
 */
public class LocalPmcFileCheck2 {
    public static void main(String[] args) throws SQLException {
        //本地pmc 文件校验 这是第二步方法
        // 先删除目录下文件大小是0的文件或者小于2K的文件
        // 目前发现小文件页数正常的无法准确删除 目前设置删除是0的
        // 第二步 进行判断已经下载的 数量全不全
        // 优化后的 带有大小 直接判断
        String rootPath = "F:\\pmcdownextra\\";
//        String rootPath = "D:\\pmcdown\\";
//        String Path = "F:\\gcr";
        Db use = Db.use();
        List<Entity> query = use.query("select * from pmcdown_new2 where down = 2 and (is_check is null   OR  is_check = 2)");
        for (Entity entity : query) {
            Integer pmid = entity.getInt("pmid");
            String secondPath = "/" + pmid / 50000 + 1 + "/";
            String sen = rootPath + secondPath + pmid + "\\";
            String str = entity.getStr("supp");
            if (StringUtil.isNotNull(str)) {
                List<SaveEntity> ls = JSONArray.parseArray(str, SaveEntity.class);
                // 这里打算这样 先判断是否存在 然后再判断大小 如果不存在则进行打标记 如果存在则进行大小判断 大小判断使用正负10%的误差范围
                // 然后如果大小超过10%则进行删除
                boolean isDel = false;
                for (SaveEntity saveEntity : ls) {
                    String size = saveEntity.getSize();
                    String url = saveEntity.getUrl();
                    Integer code = saveEntity.getCode();
                    if (code != null && code.intValue() != 200) {
                        continue;
                    }
                    String fileName = getFileName(url);
                    File file = new File(sen + fileName);
                    if (file.exists()) {
                        if (file.length() == 0) {
                            isDel = true;
                        } else {
                            // 处理删除判断
                            boolean b = checkFileSizeAndDel(file, size);
                            if (b) {
                                // 被删除了 或者打标记了
                                isDel = true;
                            }
                        }
                    } else {
                        SmallTool.printMess("文件不存在？+" + sen + fileName);
                        FileUtil.appendUtf8String("文件不存在？+" + sen + fileName + "\n", "/usr/local/20250317checkFile.log");
                        isDel = true;
                    }
                }
                if (isDel) {
                    entity.set("del", 1);
                    entity.set("is_check", 1);
                    use.insertOrUpdate(entity, "pmid");
                } else {
                    entity.set("is_check", 1);
                    use.insertOrUpdate(entity, "pmid");
//
                }
            }

        }
    }

    public static double getFileSize(File file, String sizeFrom) {
        double sizeRes = 0;
        if (sizeFrom.contains("(") && sizeFrom.contains(")")) {
            String[] split = sizeFrom.split(", ");
            String s = split[0].replace("(", "").replace(",", "").trim();
            try {
                if (s.contains("GB")) {
                    Double sizeCheck = Double.parseDouble(s.replace("GB", "").trim()) * 1024 * 1024 * 1024;
                    if (sizeCheck >= 0.0) {
                        sizeRes = sizeCheck;
                    }

                } else if (s.contains("MB")) {
                    Double sizeCheck = Double.parseDouble(s.replace("MB", "").trim()) * 1024 * 1024;
                    if (sizeCheck >= 0.0) {
                        sizeRes = sizeCheck;
                    }

                } else if (s.contains("KB")) {
                    Double sizeCheck = Double.parseDouble(s.replace("KB", "").trim()) * 1024;
                    if (sizeCheck >= 0.0) {
                        sizeRes = sizeCheck;
                    }

                } else if (s.contains("B")) {
                    Double sizeCheck = Double.parseDouble(s.replace("B", "").trim());
                    if (sizeCheck >= 0.0) {
                        sizeRes = sizeCheck;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return sizeRes;

    }

    // 首先校验有没有()标志有则取出大小进行文件大小判断
    public static boolean checkFileSizeAndDel(File path, String size) {
        boolean flag = false;
        if (StringUtil.isNotNull(path)) {
            if (size.contains("(") && size.contains(")")) {
                try {
                    double fileSize = getFileSize(null, size);
                    if (FileUtil.size(path) >= (fileSize * (0.9)) && FileUtil.size(path) <= (fileSize * (1.1))) {
                    } else {
                        flag = true;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (flag) {
                try {
                    System.out.println("删除文件" + path);
                    FileUtil.del(path);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return flag;
    }

    // 用于判断下载后文件大小的 现在部分下载导致下载文件不对? 是不是多线程读取流导致的?
    public static boolean checkFileSizeCorrect(File path, Double size) {
        boolean flag = false;
        if (size != null && size > 0) {
            if (FileUtil.size(path) >= (size * (0.9)) && FileUtil.size(path) <= (size * (1.1))) {
                flag = true;
            }
        }

        return flag;
    }

    public static boolean isCheckDownType(String fileName) {
        if (fileName.endsWith(".pdf") || fileName.endsWith(".doc") || fileName.endsWith(".zip") || fileName.endsWith(".rar") || fileName.endsWith(".docx")) {
            return true;
        } else {
            return false;
        }
    }
}
